home *** CD-ROM | disk | FTP | other *** search
/ BMUG Revelations / BMUG Revelations.toast / Programming / Programming Languages / Yerk 3.64 / Asm source / ic1 < prev    next >
Text File  |  1990-12-22  |  8KB  |  431 lines

  1. \ Instruction Classes           Reese Warner                    3/85
  2. \      8/85  RW   added comments
  3. \      8/85  RW   Added Yerk mode
  4. \      9/85  RW   Added type 26, sized single ea instruction
  5. \      9/85  RW   Added type27, for the STOP instruction
  6. \     12/85  JF   Fixed LENGTH: method on TYPE3
  7. \  03/07/86  GDC  Fixed type 7 BUILD:
  8. \   7/10/86  mrh  Fixed type 6, for short branches
  9.  
  10. 0 -> dlevel
  11.  
  12. :CLASS machInst <super object
  13.  
  14.     var bytecode
  15.     int srcMask
  16.     int dstMask
  17.     int theSize
  18.  
  19. :M INIT:    { opcode -- }
  20.     opcode put: bytecode
  21.     hex
  22.     @word number drop put: srcMask     \ reads sourcemask
  23.     @word number drop put: dstMask     \ reads destination mask
  24.     @word number drop put: theSize     \ reads the machine code size
  25.     decimal
  26. ;M
  27.  
  28. :M BC:  \ debug
  29.     binary get: bytecode ." bytecode is " u. cr decimal
  30. ;M
  31.  
  32. :M MASKS:   \ debug
  33.     hex get: srcMask ." src is " u. cr
  34.     get: dstMask ." dst is " u. cr
  35. ;M
  36.  
  37. :M OPSIZE:
  38.     get: theSize
  39. ;M
  40.  
  41. ;CLASS
  42.  
  43. \ TYPE1 - No operand instructions, such as Reset, Stop, etc.
  44. :CLASS type1 <super machInst
  45.  
  46. :M BUILD:
  47.     get: bytecode w,
  48. ;M
  49.  
  50. :M LENGTH: ( -- len )
  51.     1
  52. ;M
  53.  
  54. ;CLASS
  55.  
  56. \ TYPE2 - Register, immediate value, such as Link
  57. \  e.g. Link A0,#100
  58. :CLASS type2 <super machInst
  59.  
  60. :M BUILD:   { \ workSpace -- }
  61.     op1 getOp
  62.     get: bytecode -> workSpace
  63.     workSpace reg: op1 or w,
  64.     op2 getOp
  65.     value: op2 w,
  66. ;M
  67.  
  68. :M LENGTH: ( -- len )
  69.     op1 getOp
  70.     op1 get: srcMask check
  71.     op2 getOp
  72.     op2 get: dstMask check
  73.     2
  74. ;M
  75.  
  76. ;CLASS
  77.  
  78. \ TYPE3 - Instructions that take an immediate operand, such as ANDI, EORI
  79. \  e.g. EORI.W #100,-(A4)
  80. :CLASS type3 <super machInst
  81.  
  82. :M BUILD:   { \ workSpace -- }
  83.     op1 getOp
  84.     op2 getOp
  85.     get: bytecode -> workSpace
  86.     opSize 6 << workSpace or -> workSpace
  87.     ea: op2 workspace or -> workSpace
  88.     workSpace w,
  89.     value: op1      \ immediate Data
  90.     opSize 2 =
  91.     IF
  92.         ,
  93.     ELSE
  94.         w,
  95.     THEN
  96.     op2 compIdxMode
  97. ;M
  98.  
  99. :M LENGTH:  { \ size -- len }
  100.     op1 getOp
  101.     op1 get: srcMask check
  102.     op2 getOp
  103.     op2 get: dstMask check
  104.     2 -> size       \ 1 -> 2 jaf 12/17
  105.     op2 modeSize ++> size
  106.     opSize 1- 0 max ++> size   \ '1 max' -> '1- 0 max' jaf 12/17
  107.     size
  108. ;M
  109.  
  110. ;CLASS
  111.  
  112. \ TYPE4 - Instructions that take a reg, an effective Addr, an opmode
  113. \  e.g. OR.L d0,(SP), ADD
  114. :CLASS type4 <super machInst
  115.  
  116. :M BUILD:   { \ opMode Reg EA workSpace flag -- }
  117.     op1 getOp
  118.     op2 getOp
  119.     true -> flag
  120.     mode: op2 1 =
  121.     IF
  122.         opSize 2 =
  123.         IF
  124.             7 -> opMode
  125.         ELSE
  126.             3 -> opMode
  127.         THEN
  128.         reg: op2 -> reg
  129.         ea: op1 -> ea
  130.         false -> flag
  131.     THEN
  132.     mode: op2 0= flag and 
  133.     IF
  134.         opSize -> opMode
  135.         reg: op2 -> reg
  136.         ea: op1 -> ea
  137.         false -> flag
  138.     THEN
  139.     mode: op1 0= flag and
  140.     IF
  141.         opSize 4+ -> opMode
  142.         reg: op1 -> reg
  143.         ea: op2 -> ea
  144.         false -> flag
  145.     THEN
  146.     flag
  147.     IF
  148.         219 asmERROR   \ at least one operand must be a register direct
  149.     THEN
  150.     get: bytecode -> workSpace
  151.     reg 9 << workSpace or -> workspace
  152.     opMode 6 << workSpace or -> workSpace
  153.     ea workSpace or -> workSpace
  154.     workSpace w,
  155.     op1 compIdxMode
  156.     op2 compIdxMode
  157. ;M
  158.  
  159. :M LENGTH:  { \ len -- len }
  160.     op1 getOp
  161.     op1 get: srcMask check
  162.     op2 getOp
  163.     op2 get: srcMask check
  164.     1 -> len
  165.     op1 modesize ++> len
  166.     op2 modesize ++> len
  167.     len
  168. ;M
  169.  
  170. ;CLASS
  171.  
  172. \ TYPE5 - reg & ea, unsized e.g. LEA -(A4),A3
  173. :CLASS type5 <super machInst
  174.  
  175. :M BUILD:   { \ workSpace -- }
  176.     op1 getOp
  177.     op2 getOp
  178.     get: bytecode -> workSpace
  179.     reg: op2 9 << workSpace or -> workSpace
  180.     ea: op1 workSpace or -> workSpace
  181.     workSpace w,
  182.     op1 compIdxMode
  183. ;M
  184.  
  185. :M LENGTH:  ( -- len )
  186.     op1 getOp
  187.     op1 get: srcMask check
  188.     op2 getOp
  189.     op2 get: dstMask check
  190.     1 op1 modeSize +
  191. ;M
  192.  
  193. ;CLASS
  194.  
  195. \ TYPE6 - Branch Instructions
  196. \  e.g. BNE aLabel
  197. :CLASS type6 <super machInst
  198.  
  199. :M BUILD:
  200.     op1 getOp
  201.     get: bytecode value: op1
  202.     opSize 0=
  203.     IF  dup 127 > over -128 < or
  204.         IF 250 asmerror THEN  $ ff and or
  205.     ELSE swap w,
  206.     THEN w,
  207. ;M
  208.  
  209. :M LENGTH:
  210.     op1 getOp
  211.     op1 get: srcMask check
  212.     opSize IF 2 ELSE 1 THEN
  213. ;M
  214.  
  215. ;CLASS
  216.  
  217. \ TYPE7 - Bit test operations: BCLR,BSET,BTST,BCHG
  218. \  e.g. BTST D5,-(A4) or BTST #5,-(A4)
  219. :CLASS type7 <super machInst
  220.  
  221. :M BUILD:   { \ workSpace -- }
  222.     op1 getOp
  223.     op2 getOp
  224.     get: bytecode -> workSpace
  225.     mode: op1 0=
  226.     IF
  227.         reg: op1 9 << workSPace or -> workSpace
  228.         ea: op2 workSpace or -> workSpace
  229.         256 workspace or -> workspace
  230.         workSpace w,
  231.     ELSE
  232.         ea: op2 workSpace or -> workSpace
  233.         2048 workspace or -> workSpace
  234.         workSpace w,
  235.         value: op1 w,
  236.     THEN
  237.     op2 compIdxMode
  238. ;M
  239.  
  240. :M LENGTH:  { \ len -- len }
  241.     op1 getOp
  242.     op1 get: srcMask check
  243.     op2 getOp
  244.     op2 get: dstMask check
  245.     mode: op1 0=
  246.     IF
  247.         1 -> len
  248.     ELSE
  249.         2 -> len
  250.     THEN
  251.     len
  252. ;M
  253.  
  254. ;CLASS
  255.  
  256. \ TYPE8 - single ea instructions. E.G. PEA aLabel
  257. :CLASS type8 <super machInst
  258.  
  259. :M BUILD:
  260.     op1 getOp
  261.     get: bytecode ea: op1 or w,
  262.     op1 compIdxMode
  263. ;M
  264.  
  265. :M LENGTH:  { \ len - len }
  266.     op1 getOp
  267.     op1 get: srcMask check
  268.     1 -> len 
  269.     op1 modeSize ++> len
  270.     len
  271. ;M
  272.  
  273. ;CLASS
  274.  
  275. \ TYPE9 - EXG A2,D4
  276. :CLASS type9 <super machInst
  277.  
  278. :M BUILD:   { \ work -- }
  279.     op1 getOp
  280.     op2 getOp
  281.     get: bytecode -> work
  282.     reg: op1 9 << work or -> work
  283.     reg: op2 work or -> work
  284.     mode: op1 0= mode: op2 0= and
  285.     IF
  286.         64 work or -> work
  287.     THEN
  288.     mode: op1 0= mode: op2 1 = and mode: op1 1 = mode: op2 0= and or
  289.     IF
  290.         72 work or -> work
  291.     THEN
  292.     mode: op1 1 = mode: op2 1 = and
  293.     IF
  294.         136 work or -> work
  295.     THEN
  296.     work w,
  297. ;M
  298.  
  299. :M LENGTH: ( -- len )
  300.  
  301.     op1 getOp
  302.     op1 get: srcMask check
  303.     op2 getOp
  304.     op2 get: dstMask check
  305.     1
  306. ;M
  307.  
  308. ;CLASS
  309.  
  310. \ TYPE10 - EXT.L DO
  311. :CLASS type10 <super machInst
  312.  
  313. :M BUILD:   { \ work -- }
  314.     op1 getOp
  315.     get: bytecode -> work
  316.     reg: op1 work or -> work
  317.     opSize 1+  2 max 6 << work or -> work       \ set opMode field
  318.     work w,
  319. ;M
  320.  
  321. :M LENGTH:
  322.     op1 getOp
  323.     op1 get: srcMask check
  324.     1
  325. ;M
  326.  
  327. ;CLASS
  328.  
  329. \ TYPE11 - Shift operations e.g. LSL.W #2,D0
  330. :CLASS type11 <super machInst
  331.  
  332. :M BUILD:   { \ work val -- }
  333.     op1 getOp
  334.     get: bytecode -> work
  335.     mode: op1 11 = mode: op1 0= or
  336.     IF
  337.         opSize 6 << work or -> work
  338.         op2 getOp
  339.         mode: op1 0=
  340.         IF
  341.             32 work or -> work
  342.             reg: op1 9 << work or -> work
  343.         ELSE
  344.             value: op1 -> val
  345.             val 8 mod -> val
  346.             val 9 << work or -> work
  347.         THEN
  348.         reg: op2 work or -> work
  349.         work w,
  350.     ELSE
  351.         192 work or -> work
  352.         ea: op1 work or w,
  353.         op1 compIdxMode
  354.     THEN
  355. ;M
  356.  
  357. :M LENGTH: { \ len -- len }
  358.     op1 getOp
  359.     op1 get: srcMask check
  360.     mode: op1 11 = mode: op1 0= or
  361.     IF
  362.         op2 getOp
  363.         op2 get: dstMask check
  364.         1 -> len
  365.     ELSE
  366.         1 op1 modeSize + -> len
  367.     THEN
  368.     len
  369. ;M
  370.  
  371. ;CLASS
  372.  
  373. \ TYPE12 - ADDQ, SUBQ
  374. \  e.g. ADDQ.L #4,D6
  375. :CLASS type12 <super machInst
  376.  
  377. :M BUILD:   { \ work -- }
  378.     op1 getOp
  379.     op2 getOp
  380.     get: bytecode -> work
  381.     value: op1 8 mod 9 << work or -> work
  382.     opSize 6 << work or -> work
  383.     ea: op2 work or -> work
  384.     work w,
  385.     op2 compIdxMode
  386. ;M
  387.  
  388. :M LENGTH:  ( -- len )
  389.     op1 getOp
  390.     op1 get: srcMask check
  391.     op2 getOp
  392.     op2 get: dstMask check
  393.     1 op2 modeSize +
  394. ;M
  395.  
  396. ;CLASS
  397.  
  398. \ TYPE13 - ABCD, SBCD
  399. \  e.g. ABCD D1,D2 or ABCD -(A4),-(A3)
  400. :CLASS type13 <super machInst
  401.  
  402. :M BUILD:       { \ work -- }
  403.     op1 getOp
  404.     op2 getOp
  405.     get: bytecode -> work
  406.     reg: op1 work or -> work
  407.     reg: op2 9 << work or -> work
  408.     mode: op1 0= not
  409.     IF
  410.         8 ++> work
  411.     THEN
  412.     work w,
  413. ;M
  414.  
  415. :M LENGTH:      { \ len -- len }
  416.     op1 getOp
  417.     op1 get: srcMask check
  418.     op2 getOp
  419.     op2 get: dstMask check
  420.     mode: op1 mode: op2 = not 
  421.     IF
  422.         207 asmError
  423.     THEN
  424.     1 -> len
  425.     op1 modesize ++> len
  426.     op2 modesize ++> len
  427.     len
  428. ;M
  429.  
  430. ;CLASS
  431.